let express = require('express');
let Router = express.Router();
module.exports = Router;

let query = require('./db');
const jwt = require('jsonwebtoken');
// token的秘钥
let secret = 'wssb996'

// 导入multer multer 库来处理文件上传和存储
let multer = require('multer')
// 导入path
let path = require('path')

// 导入加密模块，是内置模块，不需要安装
let crypto = require('crypto')

// 设置配置 
// 接收一个对象作为参数，该对象包含用于指定文件保存位置和文件命名的方法
let storage = multer.diskStorage({
    // 指定了文件保存的路径
    destination: path.join(__dirname, '../static/images'),
    // 用于生成文件名的回调函数，
    filename: (req, file, cb) => {
        // 获取上传文件的扩展名
        let ext = path.extname(file.originalname)
        // 这行代码将生成的文件名作为回调函数的第二个参数传递给 cb，完成文件名的设定。
        cb(null, file.fieldname + '-' + Date.now() + ext)
    }
})

// 使用配置
// 创建一个 multer 中间件实例，并将配置选项 storage 传入其中。这样创建的 upload 对象可以用于处理文件上传操作
let upload = multer({
    storage
})



// 登录数据接口
// 参数：username password 
// http://localhost:9091/api/user/login
Router.post('/login', async (req, res) => {

    let {
        username,
        password
    } = req.body;

    // try和catch捕获错误，没错误走try,有错误走catch
    try {
        // 把密码加密后再去查询用户登录
        let md5 = crypto.createHash('md5')
        md5.update(password)
        let newPassword = md5.digest('hex')
        // 查询用户
        let data = await query(`select * from user where user_name='${username}' and pass_word='${newPassword}';`);
        // 如果根据用户名和密码能查询到数据则说明登录成功，否则登录失败
        // 当查询不到数据的时候 data的值为一个空数组
        if (data.length == 0) {
            res.send({
                code: 400,
                msg: '用户名或者密码错误'
            })
            return;
        }

        // 执行到这的时候 那么说明登录成功的，在这里生成token字符串
        /*
            jwt.sign(参数1,参数2,参数3)
                参数1：是一个对象，表示用户相关的信息
                参数2：加密秘钥 secret
                参数3：也是一个对象，主要就是设置token的一些相关信息，过期时间之类
        */
        //    把请求数据放到info中
        let info = {
            ...data[0]
        }
        let token = jwt.sign(info, secret, {
            // 过期时间为30分钟
            expiresIn: 60 * 30 * 1000
        })
        //    返回token
        res.send({
            code: 200,
            msg: '登录成功',
            token
        })
    } catch (error) {
        console.log(error);
        res.send({
            code: 400,
            msg: '请求出错'
        })
    }
})

// 获取用户信息的数据接口
Router.get('/me', async (req, res) => {
    // token是随着请求头传递过来，回去请求头中的数据
    // req.headers.authorization
    // let token=req.headers.authorization;
    // // 后端解析token
    // jwt.verify(token,secret,(err,decode)=>{
    //     if(err){
    //         res.send({
    //             code:400,
    //             msg:'未登录'
    //         })
    //         return
    //     }
    //      // decode 就是用户相关的信息
    //     //  目的是不返回user密码，decode里面包含user密码
    //      let info = {
    //         ...decode
    //     }
    //     // 删除对象中pass_word属性
    //     delete info.pass_word
    //     res.send(info)

    // })
    let {
        user_id
    } = req.info;
    try {
        let data = await query(`select * from user where user_id=${user_id};`)
        delete data[0].pass_word;
        res.send({
            code: 200,
            msg: '查询成功',
            ...data[0]
        })
    } catch (error) {
        res.send({
            code: 400,
            msg: error
        })
    }

})

// 修改用户信息的接口
// 涉及到文件的传递，不能用get请求
// upload.single()处理单个文件的中间件
// upload.array()处理多个文件的中间件

// 指定只处理名为 'avatar' 的文件上传
Router.post('/updateUser', upload.single('avatar'), async (req, res) => {
    // 文件的传递，不像之前json,字符串，数字那样处理，得用插件（multer）
    // multer 这个就是帮助我们处理formdata格式的参数
    // 文件处理方到 req.file 中
    // 普通数据类型处理放到 req.body中
    let file = req.file
    console.log(file, 'file');
    let {
        username,
        sex,
        city,
        ms
    } = req.body
    let { user_id } = req.info;
    let sql = '';
    // 如果传来的有文件
    if (file) {
        let imgurl = `http://localhost:9091/images/` + file.filename;
        sql = `update user set user_avatar='${imgurl}',user_name='${username}',sex='${sex}',city='${city}',ms='${ms}' WHERE user_id=${user_id};`;
    } else {
        sql = `update user set user_name='${username}',sex='${sex}',city='${city}',ms='${ms}' WHERE user_id=${user_id};`;
    }
    try {
        await query(sql);
        res.send({
            code: 200,
            msg:'修改成功'
        })
    } catch (error) {
        res.send({
            code: 400,
            msg:error
        })
    }
})

// 注册的接口
Router.put('/register', async (req, res) => {
    let {
        username,
        password,
        sex
    } = req.body

    // 创建加密方式 为md5加密方式
    let md5 = crypto.createHash('md5')
    md5.update(password);
    // 签名认证之后把密码导出
    let newPassword = md5.digest('hex');
    try {

        await query(`insert into user values(${null},'${username}','${newPassword}',${null},'${sex}',${null},${null});`)
        res.send({
            code: 200,
            msg: '注册成功'
        })
    } catch (err) {
        console.log(`insert into user values(${null},'${username}','${newPassword}',${null},'${sex}',${null},${null});`);
        res.send({
            code: 400,
            msg: '注册失败1'
        })
    }
})

// 判断用户名存在的接口
// 检测用户是否存在的数据接口
// /api/user/check/用户名
Router.get('/check/:username',async (req, res) => {
    let { username } = req.params;
    try {
        let data = await query(`select * from user where user_name='${username}';`);
        // 存不存在都会返回数组
        // 存在则数组有数据
        // 不存在:数组为空数组
        if (data.length == 0) {
            res.send({
                code: 200,
                msg:'正常注册'
            })
            return
        }
        res.send({
            code: 400,
            msg:'用户名已经存在'
        })

    } catch (error) {
        res.send({
            code: 400,
            msg:error
        })
    }
})